package top.leinx.fxnotes.paint;

/**
 * @Author : xiaolei
 * @DateTime: 2021/3/28 11:13 上午
 */

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.RadialGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class RadialGradientExample extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        FlowPane pane = new FlowPane(5.0, 5.0);
        pane.setPadding(new Insets(5, 5, 5, 5));

        // 创建多个矩形
        Circle[] circles = new Circle[6];
        for (int i = 0; i < circles.length; i++) {
            circles[i] = new Circle(100.0);
        }

        // 创建渐变的停止点数组，这里只指定了起点和终点2个停止点，线形渐变对象会用插值方式生成渐变过程中的颜色
        Stop[] stops = new Stop[]{new Stop(0, Color.GREEN), new Stop(1, Color.RED)};

        // 使用stops的停止点创建线性渐变对象，使用比例方式。
        // 焦点度数0，焦点距离0，渐变圆心位于填充圆的圆心，渐变圆半径是填充圆半径
        RadialGradient rg1 = new RadialGradient(0, 0, 0.5, 0.5, 1.0, true, CycleMethod.NO_CYCLE, stops);
        circles[0].setFill(rg1);

        // 使用stops的停止点创建线性渐变对象，使用比例方式。
        // 焦点度数0，焦点距离0，渐变圆心位于填充圆的圆心，渐变圆半径是填充圆半径的30%，
        // 剩余部分30%到100%用停止点的终点填充。
        RadialGradient rg2 = new RadialGradient(0, 0, 0.5, 0.5, 0.3, true, CycleMethod.NO_CYCLE, stops);
        circles[1].setFill(rg2);

        // 使用stops的停止点创建线性渐变对象，使用比例方式。
        // 焦点度数0，焦点距离0，渐变圆心位于填充圆的圆心，渐变圆半径是填充圆半径的30%，
        // 剩余部分30%到100%对称填充。
        RadialGradient rg3 = new RadialGradient(0, 0, 0.5, 0.5, 0.3, true, CycleMethod.REFLECT, stops);
        circles[2].setFill(rg3);

        // 使用stops的停止点创建线性渐变对象，使用比例方式。
        // 焦点度数0，焦点距离0，渐变圆心位于填充圆的圆心，渐变圆半径是填充圆半径的25%，
        // 剩余部分25%到100%重复填充。
        RadialGradient rg4 = new RadialGradient(0, 0, 0.5, 0.5, 0.25, true, CycleMethod.REPEAT, stops);
        circles[3].setFill(rg4);

        // 使用stops的停止点创建线性渐变对象，使用比例方式。
        // 焦点度数45，焦点距离圆心0.5，渐变圆心位于填充圆的圆心，渐变圆半径是填充圆半径的25%，
        // 剩余部分25%到100%重复填充。
        RadialGradient rg5 = new RadialGradient(45, 0.5, 0.5, 0.5, 0.25, true, CycleMethod.REPEAT, stops);
        circles[4].setFill(rg5);

        // 使用stops的停止点创建线性渐变对象，使用像素方式。
        // 焦点度数0，焦点距离圆心50，渐变圆心位于填充圆的圆心，渐变圆半径是25，
        // 剩余部分25到100重复填充。
        RadialGradient rg6 = new RadialGradient(0, 50, 100, 100, 25, false, CycleMethod.REFLECT, stops);
        circles[5].setFill(rg6);

        // 填充矩形
        RadialGradient rg7 = new RadialGradient(0, 0, 0.5, 0.5, .25, true, CycleMethod.REFLECT, stops);
        Rectangle rectangle = new Rectangle(0, 0, 200.0, 200.0);
        rectangle.setFill(rg7);

        // 填充多边形-三角形
        RadialGradient rg8 = new RadialGradient(0, 0, 0.5, 0.5, .25, true, CycleMethod.REPEAT, stops);
        Polygon triangle = new Polygon(100.0, 0.0, 0.0, 200.0, 200.0, 200.0);
        triangle.setFill(rg8);

        // 填充多边形-八边形
        RadialGradient rg9 = new RadialGradient(0, 0, 0.5, 0.5, 1, true, CycleMethod.NO_CYCLE, stops);
        Polygon octagon = new Polygon(
                200 / 3.0, 0, 400 / 3.0, 0,
                200, 200 / 3.0, 200, 400 / 3.0,
                400 / 3.0, 200, 200 / 3.0, 200,
                0, 400 / 3.0, 2, 200 / 3.0
        );
        octagon.setFill(rg9);

        pane.getChildren().addAll(circles);
        pane.getChildren().add(rectangle);
        pane.getChildren().add(triangle);
        pane.getChildren().add(octagon);

        primaryStage.setTitle("Paint - RadialGradient 填充示例");
        primaryStage.setScene(new Scene(pane, 640, 640));
        primaryStage.show();
    }
}
